package com.chenchao.javaerror;

/**
 * @encoding : UTF-8
 * @Time : 2020/11/14 16:23
 * @Author : Chen Chao
 * @File : javaSE.com.chenchao.javaerror.Test3.java
 * @Software : IntelliJ IDEA
 * @since : 1.8
 */
public class Test {
    public static void main(String[] args) throws MyExpection {
        //errorMessage();
        //fianl();
        //System.out.println(returnFianl());
        myException();

    }

    public static void test() {
        int[] a = {1, 2, 3};

        try {
            int i = a[4] / 0;
            System.out.println("捕获异常后我不被执行");
            //JDK7后面可以用|同时捕获多种异常，但异常不能是包含关系
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("df");
        } catch (Exception e) {
            System.out.println("GG");
        }
    }
    public static void errorMessage(){
        try {
            int i = 10 / 0;
        } catch (Exception e) {
            //获取异常信息
            System.out.println(e.getMessage());
            System.out.println("=====================");
            //获取异常类名和信息
            System.out.println(e);
            System.out.println("=====================");
            //获取异常类名，信息，位置（system.err输出）
            e.printStackTrace();
        }
    
    }

    /**
     * 除了jvm挂掉，fianlly一定被执行
     */
    public static void fianl(){
        try {
            int i = 10 / 0;
        } catch (Exception e) {
            e.printStackTrace();
            //System.exit(0);//jvm挂了fianlly不死也得死
            return;
        } finally {
            System.out.println("return 阻止不了我");
        }

    }

    /**
     * fianlly返回值问题
     *
     */
    public static int returnFianl(){
        int i=10;
        try {
            return i;
        } catch (Exception e) {
            e.printStackTrace();
            return i;
        } finally {
            i=300;
            //虽然会执行final,但已经返回了重新不会重新返回
            //除非再return i;
        }
    }

    /**
     * 自定义异常
     */
    public static void myException() throws MyExpection {
        //throw new MyRuntime();

        //编译时异常必须处理，要么自己处理
        //要么抛给调用者，直到main抛给其调用者JVM
        //日理万机的JVM会直接打印出来
        //throw new MyExpection();
        try {
            throw new MyExpection2("我带参了");
        } catch (MyExpection2 myExpection2) {
            myExpection2.printStackTrace();
        }
    }
}

/**
 * 自定义运行时异常
 */
class MyRuntime extends RuntimeException{

}
/**
 * 自定义编译时异常
 */
class MyExpection extends Exception{

}

/**
 * 自定义带参异常
 * 自定义带参构造器，并调用父类的带参构造方法
 * 抛出异常时要带参，参数最终传给了detailMessage这个成员变量
 */
class MyExpection2 extends Exception{
    public MyExpection2(String message) {
        super(message);
    }

    public MyExpection2() {
    }
}

